#ifndef VIRTUALTHUMBNAILVIEW_H
#define VIRTUALTHUMBNAILVIEW_H

#include <QListWidget>
#include <QTimer>
#include <QScrollBar>
#include <QApplication>
#include <QPainter>
#include <QImage>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QDateTime>
#include <QRect>
#include <QSize>
#include <QWidget>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QPaintEvent>
#include <QResizeEvent>
#include <QString>
#include "unifiedcachemanager.h"
#include "fileidentitymanager.h"
#include "unified_memory_interfaces.h"

class VirtualThumbnailView : public QListWidget
{
    Q_OBJECT

public:
    explicit VirtualThumbnailView(QWidget *parent = nullptr);
    ~VirtualThumbnailView();

    // 设置缩略图数据
    void setThumbnails(const QList<QImage>& thumbnails);
    void setThumbnailsFromCache(const QString& fileIdentity, int totalPages);
    
    // 获取当前选中的缩略图索引
    int getCurrentThumbnailIndex() const;
    
    // 滚动到指定缩略图
    void scrollToThumbnail(int index);
    
    // 更新单个缩略图
    void updateThumbnail(int index, const QImage& thumbnail);
    
    // 新增：渐进式更新方法
    void refreshThumbnailsFromCache(const QString& fileIdentity);
    void enableProgressiveLoading(bool enabled);
    void setProgressiveUpdateInterval(int intervalMs);
    
    // 动态扩展方法
    void expandTotalPages(int newTotalPages);

signals:
    void thumbnailSelected(int index);
    void thumbnailClicked(int index);
    void thumbnailProgressivelyLoaded(int index); // 新增：渐进式加载完成信号
    void needMoreThumbnails(int startIndex, int count); // 新增：请求更多缩略图信号

protected:
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
    void scrollContentsBy(int dx, int dy) override;
    void mousePressEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;

private slots:
    void onScrollTimer();
    void onLoadTimer();
    void onMemoryCleanupTimer();
    void onProgressiveUpdateTimer(); // 新增：渐进式更新定时器槽

private:
    // 缩略图项目结构
    struct ThumbnailItem {
        int index;              // 在总列表中的索引
        QImage thumbnail;       // 缩略图数据（可能为空）
        bool isLoaded;          // 是否已加载
        bool isLoading;         // 是否正在加载
        QRect position;         // 在视图中的位置
        QString cachePath;      // 缓存路径
        
        ThumbnailItem() : index(-1), isLoaded(false), isLoading(false) {}
    };
    
    // 核心数据
    QList<ThumbnailItem> m_allItems;      // 所有项目（包含占位符）
    QList<ThumbnailItem*> m_visibleItems; // 当前可见项目
    QString m_currentFileIdentity;       // 当前文件标识
    int m_totalPages;                     // 总页数
    
    // 滚动相关
    int m_scrollPosition;                 // 滚动位置
    int m_viewportHeight;                 // 视口高度
    int m_itemHeight;                     // 每个项目高度
    int m_itemWidth;                      // 每个项目宽度
    int m_spacing;                        // 项目间距
    
    // 加载相关
    QTimer* m_scrollTimer;                // 滚动定时器
    QTimer* m_loadTimer;                  // 加载定时器
    QTimer* m_memoryTimer;                // 内存清理定时器
    QTimer* m_progressiveTimer;           // 渐进式更新定时器
    QMutex m_loadMutex;                   // 加载互斥锁
    QWaitCondition m_loadCondition;      // 加载条件变量
    
    // 性能优化
    int m_bufferSize;                     // 缓冲区大小
    int m_maxLoadedItems;                 // 最大加载项目数
    bool m_isScrolling;                   // 是否正在滚动
    
    // 渐进式加载控制
    bool m_progressiveLoadingEnabled;     // 是否启用渐进式加载
    int m_progressiveUpdateInterval;      // 渐进式更新间隔（毫秒）
    QDateTime m_lastProgressiveUpdate;    // 上次渐进式更新时间
    
    // 初始化方法
    void initializeView();
    void setupTimers();
    void setupScrollBar();
    
    // 虚拟滚动核心方法
    void updateVisibleItems();
    void calculateItemPositions();
    void renderVisibleItems();
    
    // 缩略图加载方法
    void loadVisibleThumbnails();
    void loadThumbnailAsync(int index);
    // TDD: 旧的loadThumbnailFromCache已删除，现在使用统一缓存管理
    void createPlaceholder(int index);
    
    // 检查UI是否需要更新（检测占位符图标）
    bool needsUIUpdate(QListWidgetItem* listItem, const ThumbnailItem& item, int index) const;
    
    // 渐进式加载方法
    void performProgressiveUpdate();
    void checkForNewThumbnails();
    bool isThumbnailFileNewer(int index) const;
    bool checkAndLoadNewThumbnail(int index);
    
    // 动态边界扩展方法
    void checkNeedMoreThumbnails();
    void requestMoreThumbnailsIfNeeded();
    bool isScrollingNearBoundary() const;
    
    // 内存管理方法
    void manageThumbnailMemory();
    void cleanupDistantItems();
    void preloadNearbyItems();
    
    // 工具方法
    int getItemIndexAtPosition(int y) const;
    QRect getItemRect(int index) const;
    bool isItemVisible(int index) const;
    void updateScrollBar();
    
    // 缓存相关
    UnifiedCacheManager* m_cacheManager;
    
    // TDD: 统一内存管理集成
    IUnifiedMemoryManager* m_unifiedMemoryManager;  // 不拥有所有权，由MainWindow管理
    
    QString getThumbnailCachePath(int index) const;
    bool isThumbnailCached(int index) const;
    
    // TDD: 新的统一缓存加载方法
    QImage loadThumbnailFromUnifiedCache(int index);
    
public slots:
    // TDD: 设置统一内存管理器的槽函数
    void setUnifiedMemoryManager(IUnifiedMemoryManager* manager);
    
private:
    // 线程安全相关
    QMutex m_checkMutex;   // 保护checkAndLoadNewThumbnail

    // 重复点击防护
    int m_lastSelectedIndex;  // 记录上次选中的索引，用于防止重复点击
};

#endif // VIRTUALTHUMBNAILVIEW_H
